/**
 * @file logger.h
 * @brief 正式日志系统头文件
 * @details 提供完整的日志系统功能，包括多级别日志、文件输出、控制台输出、
 *          性能监控、内存跟踪等功能。支持线程安全的日志记录。
 * 
 * @author zyb
 * @date 2025-09-29
 * @version 1.0
 * 
 * @note 本日志系统是正式的工业级日志实现
 * @warning 所有日志函数都是线程安全的
 */

#ifndef LOGGER_H
#define LOGGER_H

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdarg.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ==================== 日志级别定义 ==================== */

/**
 * @brief 日志级别枚举
 */
typedef enum {
    LOG_LEVEL_FATAL = 0,    /* 致命错误 */
    LOG_LEVEL_ERROR = 1,    /* 错误 */
    LOG_LEVEL_WARN = 2,     /* 警告 */
    LOG_LEVEL_INFO = 3,     /* 信息 */
    LOG_LEVEL_DEBUG = 4,    /* 调试 */
    LOG_LEVEL_TRACE = 5     /* 跟踪 */
} log_level_t;

/* ==================== 日志配置结构 ==================== */

/**
 * @brief 日志配置结构
 */
typedef struct {
    log_level_t level;          /* 日志级别 */
    bool console_output;        /* 控制台输出 */
    bool file_output;           /* 文件输出 */
    bool color_output;          /* 颜色输出 */
    bool timestamp;             /* 时间戳 */
    bool module_name;           /* 模块名称 */
    bool function_name;         /* 函数名称 */
    bool line_number;           /* 行号 */
    char log_file[256];         /* 当前日志文件路径 */
    char base_path[256];        /* 日志文件基础路径 */
    char base_name[64];         /* 日志文件基础名称 */
    char extension[16];         /* 日志文件扩展名 */
    bool use_timestamp_naming;  /* 是否使用时间戳命名 */
    char timestamp_format[32];  /* 时间戳格式 */
    uint32_t max_file_size;     /* 最大文件大小 */
    uint32_t max_file_count;    /* 最大文件数量 */
} logger_config_t;

/* ==================== 函数声明 ==================== */

/**
 * @brief 初始化日志系统
 * @details 初始化日志系统，设置默认配置
 * 
 * @return 0表示成功，-1表示失败
 */
int logger_init(void);

/**
 * @brief 销毁日志系统
 * @details 清理日志系统资源
 */
void logger_destroy(void);

/**
 * @brief 设置日志级别
 * @details 设置全局日志级别
 * 
 * @param level 日志级别
 * @return 0表示成功，-1表示失败
 */
int logger_set_level(log_level_t level);

/**
 * @brief 获取当前日志级别
 * @details 获取当前设置的日志级别
 * 
 * @return 当前日志级别
 */
log_level_t logger_get_level(void);

/**
 * @brief 配置日志系统
 * @details 使用自定义配置配置日志系统
 * 
 * @param config 日志配置
 * @return 0表示成功，-1表示失败
 */
int logger_configure(const logger_config_t *config);

/**
 * @brief 清理日志系统
 * @details 关闭日志文件，清理资源
 */
void logger_cleanup(void);

/**
 * @brief 获取日志配置
 * @details 获取当前日志配置
 * 
 * @param config 输出配置结构
 * @return 0表示成功，-1表示失败
 */
int logger_get_config(logger_config_t *config);

/* ==================== 日志宏定义 ==================== */

/**
 * @brief 日志宏定义
 * @details 提供便捷的日志记录宏
 */
#define LOG_FATAL(module, fmt, ...) \
    logger_log(LOG_LEVEL_FATAL, module, __func__, __LINE__, fmt, ##__VA_ARGS__)

#define LOG_ERROR(module, fmt, ...) \
    logger_log(LOG_LEVEL_ERROR, module, __func__, __LINE__, fmt, ##__VA_ARGS__)

#define LOG_WARN(module, fmt, ...) \
    logger_log(LOG_LEVEL_WARN, module, __func__, __LINE__, fmt, ##__VA_ARGS__)

#define LOG_INFO(module, fmt, ...) \
    logger_log(LOG_LEVEL_INFO, module, __func__, __LINE__, fmt, ##__VA_ARGS__)

#define LOG_DEBUG(module, fmt, ...) \
    logger_log(LOG_LEVEL_DEBUG, module, __func__, __LINE__, fmt, ##__VA_ARGS__)

#define LOG_TRACE(module, fmt, ...) \
    logger_log(LOG_LEVEL_TRACE, module, __func__, __LINE__, fmt, ##__VA_ARGS__)

/* ==================== 内部函数声明 ==================== */

/**
 * @brief 内部日志记录函数
 * @details 实际的日志记录实现
 * 
 * @param level 日志级别
 * @param module 模块名称
 * @param function 函数名称
 * @param line 行号
 * @param format 格式字符串
 * @param ... 参数列表
 */
void logger_log(log_level_t level, const char *module, const char *function, 
                int line, const char *format, ...);

/**
 * @brief 格式化日志消息
 * @details 格式化日志消息为字符串
 * 
 * @param buffer 输出缓冲区
 * @param buffer_size 缓冲区大小
 * @param level 日志级别
 * @param module 模块名称
 * @param function 函数名称
 * @param line 行号
 * @param format 格式字符串
 * @param args 参数列表
 * @return 格式化后的字符串长度
 */
int logger_format_message(char *buffer, size_t buffer_size, log_level_t level,
                         const char *module, const char *function, int line,
                         const char *format, va_list args);

/**
 * @brief 获取日志级别字符串
 * @details 将日志级别转换为字符串
 * 
 * @param level 日志级别
 * @return 日志级别字符串
 */
const char* logger_level_to_string(log_level_t level);

/**
 * @brief 获取当前时间戳
 * @details 获取格式化的当前时间戳
 * 
 * @param buffer 输出缓冲区
 * @param buffer_size 缓冲区大小
 * @return 时间戳字符串长度
 */
int logger_get_timestamp(char *buffer, size_t buffer_size);

#ifdef __cplusplus
}
#endif

#endif /* LOGGER_H */
